const axios = require('axios');
const cheerio = require('cheerio');
const TurndownService = require('turndown');
const {gfm, tables, strikethrough} = require('turndown-plugin-gfm');

//html2md
// 定义一个函数，将 HTML 转换为 Markdown 格式
const html2md = (html) => {
  // 创建一个新的 TurndownService 实例，用于转换 HTML 到 Markdown
  const turndownService = new TurndownService({
    headingStyle: 'atx',
    codeBlockStyle: 'fenced'
  })
  // 使用 gfm 插件，它提供了对 GitHub Flavored Markdown (GFM) 的支持
  turndownService.use(gfm)
  // 使用 tables 和 strikethrough 插件，分别用于支持表格和删除线
  turndownService.use([tables, strikethrough])

  // 使用 turndownService 将传入的 HTML 字符串转换为 Markdown
  const markdown = turndownService.turndown(html)

  // 返回转换后的 Markdown 字符串
  return markdown
}
//获取文章标题
const getTiltle = ($, element) => {
  const title = $(element).text()
  return title ? title.replace(/\s+/g, "") : '';
}
//获取文章内容
const getContent = ($, element) => {
  const html = $(element).html()
  return html ? html2md(html) : ''
}
//获取文章标题，标题
const getBody = ($, url) => {
  if (url.includes('juejin.cn')) {
    const title = getTiltle($, 'p.article-title');
    let content = getContent($, 'div.markdown-body')
    return {title, content}
  } else if (url.includes('blog.csdn.net')) {
    const title = getTiltle($, '#articleContentId');
    let content = getContent($, '#content_views')
    return {title, content}
  } else if (url.includes('mp.weixin.qq.com')) {
    const title = getTiltle($, '#activity-name');
    let content = getContent($, '#js_content')
    return {title, content}
  } else {
    return {
      title: '',
      content: ''
    }
  }
}
// 尝试使用 axios 获取网页内容的函数
const getHtmlWithAxios = async (url) => {
  try {
    const response = await axios.get(url);
    return response.data;
  } catch (error) {
    console.error("Axios 请求失败:", error);
    return null;
  }
};
// 获取文章内容
const getarticleContent = (html, url) => {
  // 使用 cheerio 加载 HTML
  const $ = cheerio.load(html);
  // 移除 <style> 标签
  $("style").remove();
  // 移除其他可能干扰 Markdown 转换的脚本和链接标签
  $("script").remove();
  $("link").remove();
  return getBody($, url);
};
// 导出文章内容
exports.getArticleCollector = async function (req, res, next) {
  let { url } = req.body;
  try {
    // 首先尝试使用 axios 获取内容
    let html = await getHtmlWithAxios(url);
    let articleContent = html ? getarticleContent(html, url) : null;
    if (!articleContent?.title && !articleContent?.content) {
      // 如果使用 axios 失败，则使用helloworld 获取内容
      const response = await axios.get(
        `https://www.helloworld.net/getUrlHtml?url=${url}`
      );
      const result = response.data;
      let html = result.html || "";
      const reg = /<style[^>]*>.*?<\/style>/gs;
      if (reg.test(html)) {
        html = html.replace(reg, "");
      }
      articleContent = {
        title: result.title || "",
        content: html,
      };
    }
    res.success(articleContent, "查询成功");
  } catch (err) {
    next(err);
  }
};

